/*
fread()函数用于一次性从文件读取较大的数据块，主要用途是将文件内容读入一个数组，适合读取二进制数据。它的原型定义在头文件stdio.h。

size_t fread(
  void* ptr,
  size_t size,
  size_t nmemb,
  FILE* fp
);
它接受四个参数，与fwrite()完全相同。

ptr：数组地址。
size：每个数组成员的大小，单位为字节。
nmemb：数组的成员数量。
fp：文件指针。
要将文件内容读入数组arr，可以采用下面的写法。

fread(
  arr,
  sizeof(arr[0]),
  sizeof(arr) / sizeof(arr[0]),
  fp
);
上面示例中，数组长度（第二个参数）和每个成员的大小（第三个参数）的乘积，就是数组占用的内存空间的大小。fread()会从文件（第四个参数）里面读取相同大小的内容，然后将ptr（第一个参数）指向这些内容的内存地址。

下面的例子是将文件内容读入一个10个成员的双精度浮点数数组。

double earnings[10];
fread(earnings, sizeof(double), 10, fp);
上面示例中，每个数组成员的大小是sizeof(double)，一个有10个成员，就会从文件fp读取sizeof(double) * 10大小的内容。

fread()函数的返回值是成功读取的数组成员的数量。正常情况下，该返回值就是第三个参数nmemb，但如果出现读取错误或读到文件结尾，该返回值就会比nmemb小。所以，检查fread()的返回值是非常重要的。

fread()和fwrite()可以配合使用。在程序终止之前，使用fwrite()将数据保存进文件，下次运行时再用fread()将数据还原进入内存。
*/

#include <stdio.h>

int main(void)
{
    FILE *fp;
    unsigned char c;

    fp = fopen("output.bin", "rb");
    if (fp == NULL)
    {
        printf("open file error\n");
        return -1;
    }
    while (fread(&c, sizeof(char), 1, fp) > 0)
        printf("%d\n", c);

    int closed = fclose(fp);
    if (closed != 0)
    {
        printf("close file error\n");
    }
    return 0;
}